package com.lulin.mall.product.thread;

import java.util.concurrent.*;

/**
 * 线程池相关
 *
 * @author lulin
 * @date 2022/12/1 9:17
 */
public class ThreadPoolDemo {
    public static void main(String[] args) {
        //第一种方式 核心线程 = 最大线程
        ExecutorService threadPoolExecutors = Executors.newFixedThreadPool(5);
        //缓存线程池：核心线程0，最大线程 Integer最大值，存活时间1分钟
        //ExecutorService executorService = Executors.newCachedThreadPool();
        //定时任务线程池
        //ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool();
        //线程池中，永远只有1个线程处理，相当于并发的情况下，会变为同步处理
        //Executors.newSingleThreadExecutor();


        //第二种方式
        /**
         *  int corePoolSize：核心线程数，线程池创建时，就会new 出 corePoolSize个线程
         *  int maximumPoolSize：最大线程数。
         *  long keepAliveTime：存活时间。存活时间，如果当前线程数量 > 核心线程数量，空闲线程的存活时间（剩下来的）。——最大线程-核心数量。
         *      例如：当前是8个，存活5个，剩下的就是8-5=3个，剩下的这3个的存活时间就是keepAliveTime。
         *  TimeUnit unit：存活时间的单位
         *  BlockingQueue<Runnable> workQueue：阻塞的队列（一般指定队列长度）。请求进来后，如果超过最大核心数，超过的请求会进入到阻塞队列中.
         *  ThreadFactory threadFactory：创建线程的工厂对象。
         *  RejectedExecutionHandler handler：当前线程 > 核心线程数、和阻塞队列满了，会执行的淘汰策略
         */
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 100, 10, TimeUnit.SECONDS,
                //阻塞队列
                new LinkedBlockingDeque(10000),
                //淘汰策略：直接抛弃
                new ThreadPoolExecutor.AbortPolicy()
        );

        poolExecutor.execute(() -> {
            System.out.println("new ThreadPoolExecutor()方式——当前线程：" + Thread.currentThread().getName());
        });
    }
}
